#define _CRT_SECURE_NO_WARNINGS 1
#include<stdio.h>
#include<string.h>

/*
//1. 算以下代码 结果 (1+2+4+8+16+22+12+2 = 67 )
int cnt = 0;
int fib(int n)
{
	cnt++;
	if (n ==0)
		return 1;
	else if (n == 1)
		return 0;
	else
		return fib(n - 1) + fib(n - 2);
}
int main()
{     
	fib(8);
	printf("%d", cnt);
	return 0; 
}
*/
 
/*
//2. 算以下代码 结果 (死循环 打印1)
int main() {
	int x = 1;
	do
	{
		printf("%2d\n", x++); // ++先用后加   打印1
	} while (x--); // x=2  =>判断为ture 回到循环 继续打印1
	return 0;
}
*/

/*
//3 . 算以下代码 结果 (i=2，j=1)
int main()
{
	int i = 1;
	int j;
	j = i++; // ++先用后加 (即先赋值j=1)
	return 0;
}
*/

/*
//4. 算以下代码
int main() {
	int i = 10;
	int j = 20;
	int k = 3;
	k *= i + j; //（i+j）优先级高    即（10+20）*3 =90
	return 0;
}
*/

/*
//5. 算以下代码 (1   全局变量大于局部变量 
int a = 1;
void test() {
	int a =2;
	a += 1;
}
int main(){
	test();
	printf("%d\n", a);
	return 0;
}
*/

//6.下列描述中正确的是（）
//  A.表示m > n为true或者m<n为true的表达式为m>n&& m < n
//	B.switch语句结构中必须有default语句
//	C.如果至少有一个操作数为true，则包含"||"运算符的表达式true
//	D.if语句结构中必须有else语句
//	正确答案：C

//7.C语言规定，在一个源程序中，main函数的位置()
//A.必须在最开始
//B.必须在系统调用的库函数的后面
//C.可以任意
//D.必须在最后
//	正确答案：C

//8.以下叙述不正确的是()
//A.一个C源程序可由一个或多个函数组成
//B.一个c源程序必须包含一个main函数
//C.C程序的基本组成单位是函数
//D.在c程序中，注释说明只能位于一条语句的后面
//正确答案：D

//9.以下叙述正确的是()
//A.在c程序中，main函数必须位于程序的最前面
//B.c程序的每行中只能写一条语句
//C.c语言本身没有输入输出语句  / 输入输出语句 =》库函数
//D.在对一个C程序进行编译的过程中，可发现注释中的拼写错误
//	正确答案：C
				//程序运行基本过程; 预处理 =》编译=》 汇编=》链接

/*
//10.算以下代码 结果 c=-1
int main() {
	int a = 0, c = 0;
	do
	{
		--c; //c=-1;
		a = a - 1; //a=-1;
 	} while (a>0); //停止循环
	return 0;
}
*/

//11.假定x和y为double型，则执行x=2；y=x+3/2 后y的值为（)   x+3/2 =>2+1 float 要加点3.000000

/*
//12.以下for循环的执行次数是  (4次
int main() {
	int x = 0;
	int y = 0;
	for ( x = 0,y=0;(y=123)&&(x<4);x++)   //x++ =>第一次用0再加成1
	{   // 由于判断条件为(y=123)&&(x<4)   随着x++  当x=4时 循环不成立
		;
	}
	//1   //1 //1 //1 
	return 0;
}
*/

/*
//13.若有定义语句：int year=1009，*p=&year；
 //以下不能使变量year中的值增至1010的语句是: * p++  /由于++ 优先级高于*  ++到p本身 而没到*p  所以改变变不了
int main() {
	int year = 1009, * p = &year; // =>int year = 1009; int * p = &year; 
	//*p += 1;
	//(*p)++;
	//++(*p);  都可以
	return 0;
}
*/

//14.选择表达式11|10的结果(本题数值均为十进制）=》11
//11 =>1011 (二进制)
//10 =>1010       |是二进制的 按位或（有1就是1 ）
//11   1011

//15. char a; int b; float c; double d;
//    则表达式a*b+d-c值的类型为（）   =>double

//正整数A和正整数B的最小公倍数是指能被A和B整除的最小的正整数值:
//设计一个算法，求输入A和B的最小公倍数
/* //方法一：
int main() {
	int a = 0,b=0;
	scanf("%d %d", &a, &b);
	int min = a > b ? a : b; //表示最小公倍数
	while (1)
	{
		if (min % a == 0  && min % b ==  0) //m其实就是我们的最小公倍数
		{
			printf("%d\n", min);
			break;
		}
		min++;
	}
	return 0;
}
*/

/*
//方法二：
int main() {
	int a = 0, b = 0;
	scanf("%d %d", &a, &b);
	int i = 1;
	for ( i = 1; ; i++)
	{
		if (a * i % b == 0)
		{
			printf("%d\n", a * i);
			break;
		}
	}
	return 0;
}
*/

//将一句话的单词进行倒置，标点不倒置，比如 I like beijing.经过函数后变为：beijing.like I

void reverse(char *left ,char *right)
{
	while (left<right)
	{
		char tmp = 0;
		tmp = *left;
		*left = *right;
		*right =tmp;

		left++;
		right--;
	}
}
int main()
{
	char arr[100] = { 0 };
	//scanf("%s", arr); //err scanf遇到（空格）就结束输入了
	gets(arr); //输入进来
	//三步反转法:
		//1.字符串整体翻转
		//.gnijieb ekli I    (那么问题就变成逆序字符串)
	int len = strlen(arr);
	reverse(arr, arr+len-1);
	//2.每个单词逆序 -找到一个一个的单词（找空格
	//.beijing like I   （只要调用两次逆序字符串的函数
	char * start = arr;
	while (*start)
	{
		char *end = start;  //????start start记录的是一个起始位置  指针取地址
		while ( *end != ' '&& *end !='\0')   
		{
			end++;
		}
		reverse(start, end - 1); //逆序一个单词
		if (*end == ' ')  //如果是最后一个单词的话
		{ 
			start = end + 1; //跳过空格 找下一个单词
		}
		else    //就不要往后眺了
		{
			start = end;
		}
	} 


	printf("%s\n", arr);


	return 0;
}